<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        li {
            list-style: none;
            line-height: 40px;
        }

        .title {
            line-height: 40px;
        }

        .list li {
            border: 1px dashed #333;
            text-indent: 10px;
            height: 40px;
        }
    </style>
</head>

<body>
    <h3 id="title">模拟封装jquery</h3>
    <input class="inp" type="text">
    <div class="list">
        <li>li_01</li>
        <li>li_02</li>
        <li>li_03</li>
        <li>li_04</li>
        <li>li_05</li>
        <li>li_06</li>
        <li>li_07</li>
        <li>li_08</li>
        <li>li_09</li>
        <li>li_10</li>
    </div>
</body>
<script>
    // jquery  原生js封装的一个库,快速获取元素,操作元素  (dom的增删改查,事件,ajax,运动)

    // 构造函数 传入一个css选择器,返回对应的实例化对象    {eles:[]}
    function GetEle(selector) {
        // {}
        // this -> {}

        // 匹配的元素的集合
        this.eles = document.querySelectorAll(selector);

        // this.__proto__ = GetEle.prototype;
        // return this;   // {eles:[]}
    }

    // 遍历实例化对象中的集合 操作集合中的每一个元素
    GetEle.prototype.html = function (con) {
        // this ->指向调用此方法的实例化对象 {eles:[]}
        if (arguments.length >= 1) {  // 有参数
            // for (var i = 0; i < this.eles.length; i++) {
            //     var ele = this.eles[i];
            //     ele.innerHTML = con;
            // }

            // 实例化对象 均可以访问prototype上的方法
            this.each(function (ele) {
                ele.innerHTML = con;
            })

        } else { //没有参数
            // 默认返回集合中的第一个(模拟jquery)
            return this.eles[0].innerHTML;
        }
    }
    GetEle.prototype.text = function (con) {
        if (arguments.length >= 1) {  // 有参数
            // for (var i = 0; i < this.eles.length; i++) {
            //     var ele = this.eles[i];
            //     ele.textContent = con;
            // }
            this.each(function (ele) {
                ele.textContent = con;
            })
        } else { //没有参数
            // 默认返回集合中的第一个(模拟jquery)
            return this.eles[0].textContent;
        }
    }
    GetEle.prototype.val = function (con) {
        if (arguments.length >= 1) {  // 有参数
            // for (var i = 0; i < this.eles.length; i++) {
            //     var ele = this.eles[i];
            //     ele.value = con;
            // }

            this.each(function (ele) {
                ele.val = con;
            })
        } else { //没有参数
            // 默认返回集合中的第一个(模拟jquery)
            return this.eles[0].value;
        }
    }

    GetEle.prototype.hide = function () {
        // this ->指向调用此方法的实例化对象 {eles:[]}
        // for (var i = 0; i < this.eles.length; i++) {
        //     var ele = this.eles[i];
        //     ele.style.display = "none"
        // }
        this.each(function (ele) {
            ele.style.display = "none";
        })
    }
    GetEle.prototype.show = function () {
        // this ->指向调用此方法的实例化对象 {eles:[]}
        // for (var i = 0; i < this.eles.length; i++) {
        //     var ele = this.eles[i];
        //     ele.style.display = "block";
        // }
        this.each(function (ele) {
            ele.style.display = "block";
        })
    }

    // 遍历实例化对象中的集合  每次循环时执行传入的回调函数 (item,index)
    GetEle.prototype.each = function (fn) {
        // this ->指向调用此方法的实例化对象 {eles:[]}   
        // 元素的集合  this.eles
        for (var i = 0; i < this.eles.length; i++) {
            var item = this.eles[i];
            var index = i;
            // fn(item, index);
            fn.call(item, item, index);

            // 注意 jquery中 第一个参数是下标,第二个才会循环的当前元素
            // fn(index, item);
        }

    }


    var $li = new GetEle(".list li");  // {eles:[li,li,li]}
    console.log($li);
    $li.html("a123123");
    $li.hide()
    $li.each(function (item, index) {
        console.log(item, index);
    })


    var $title = new GetEle("#title");
    console.log($title);
    $title.html("hi");
    $title.hide()

    var $ip = new GetEle(".inp");
    console.log($ip);
    $ip.val("hizxczxc");
    $ip.hide()


    setTimeout(function () {
        $li.show()
        $title.show()
        $ip.show()
    }, 3000)



</script>

</html>